﻿using System;
using System.Linq.Expressions;

namespace F2Enum.Core
{
    /// <summary>
    /// Class Qui permet de faire le mappind entre un objet une information dans un fichier plat
    /// </summary>
    /// <typeparam name="T">Class de cast</typeparam>
    public class MapperClass<T>
    {
        /// <summary>
        /// Member of the object
        /// </summary>
        public Expression<Func<T, object>> Member { get; set; }
        
        /// <summary>
        /// Action on string 
        /// </summary>
        public Func<string,string> MemberAction { get; set; }
        
        /// <summary>
        /// Offset in the flat file
        /// </summary>
        public int Offset { get; set; }

        /// <summary>
        /// the length of the string
        /// </summary>
        public int Length { get; set; }

        /// <summary>
        /// the date format of string 
        /// </summary>
        public string DateFormat { get; set; }


        /// <summary>
        /// Contructeur
        /// </summary>
        /// <param name="member">membre de classe de cast</param>
        /// <param name="offset">l'offset de l'information dans le fichier plat</param>
        /// <param name="length">la longeur de l'information dans le fichier plat</param>
        public MapperClass(Expression<Func<T, object>> member, int offset, int length)
        {
            Member = member;
            Offset = offset;
            Length = length;
            DateFormat = null;
        }

        /// <summary>
        /// Contructeur
        /// </summary>
        /// <param name="member">membre de classe de cast</param>
        /// <param name="offset">l'offset de l'information dans le fichier plat</param>
        /// <param name="length">la longeur de l'information dans le fichier plat</param>
        /// <param name="dateformat">le format de la date</param>
        public MapperClass(Expression<Func<T, object>> member, int offset, int length, string dateformat)
        {
            Member = member;
            Offset = offset;
            Length = length;
            DateFormat = dateformat;
        }

        //// <summary>
        /// Contructeur
        /// <param name="member">membre de classe de cast</param>
        /// <param name="offset">l'offset de l'information dans le fichier plat</param>
        /// <param name="length">la longeur de l'information dans le fichier plat</param>
        /// <param name="dateformat">le format de la date</param>
        /// <param name="memberAction">l'action sur le string construit</param>
        public MapperClass(Expression<Func<T, object>> member, int offset, int length, string dateformat, Func<string,string> memberAction)
            : this(member, offset, length, dateformat)
        {
            MemberAction = memberAction;
        }

        /// <summary>
        /// Contructeur
        /// </summary>
        /// <param name="member">membre de classe de cast</param>
        /// <param name="offset">l'offset de l'information dans le fichier plat</param>
        /// <param name="length">la longeur de l'information dans le fichier plat</param>
        /// <param name="memberAction">l'action sur le string construit</param>
        public MapperClass(Expression<Func<T, object>> member, int offset, int length, Func<string, string> memberAction)
            : this(member, offset, length)
        {
            MemberAction = memberAction;
        }



    }
}
